﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Data.Linq;
using System.Globalization;

namespace VKontakteClient
{
    /// <summary>
    /// Класс, реализующий список изменений людей
    /// </summary>
    [Obsolete]
    class HumanChanges:System.Collections.IEnumerable
    {
        /// <summary>
        /// Перечислитель событий
        /// </summary>
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            foreach (var v in _dates)
            {
                var changedHumans = _changedHumans[v];
                while (changedHumans.Count > 0)
                {
                    string S = v.ToString(System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat);
                    S += ": ";
                    var q = changedHumans[0];
                    changedHumans.Remove(q);
                    GC.Collect(GC.MaxGeneration);
                    string Q = WhatChanged(q, v);
                    GC.Collect();
                    if (!String.IsNullOrEmpty(Q)) yield return S + Q;
                }
            }
        }

        /// <summary>
        /// Список людей, для которых смотрятся обновления
        /// </summary>
        private IEnumerable<Human> _humans;

        /// <summary>
        /// Список дат, в которые происходили изменения
        /// </summary>
        private List<DateTime> _dates;

        /// <summary>
        /// Словарь соответствия время изменения -> список измененных людей
        /// </summary>
        private Dictionary<DateTime, List<Human>> _changedHumans;

        /// <summary>
        /// Конструктор списка изменений человека
        /// </summary>
        /// <param name="humans">Список людей, для которых надо получить список изменений</param>
        public HumanChanges(IEnumerable<Human> humans)
        {
            _humans = humans;
            List<DateTime> tempDates = new List<DateTime>();
            foreach (var q in _humans.Select(v => v.Modifies)) tempDates.AddRange(q);
            _dates = tempDates.OrderByDescending(v => v).Distinct().ToList();
            _changedHumans = new Dictionary<DateTime,List<Human>>();
            foreach (var v in _dates)
                _changedHumans[v] = _humans.Where(q => q.Modifies.Contains(v)).ToList();
        }

        /// <summary>
        /// Получает строку, описывающую что изменилось у конкретного человека в конкретное время.
        /// </summary>
        /// <param name="human">Человек, у которого ищем изменения</param>
        /// <param name="when">Время, когда произошло изменение</param>
        /// <returns>Строка, описывающая событие</returns>
        private static string WhatChanged(Human human, DateTime when)
        {
            string result = ""; 
            foreach (var v in Human.Properties.Select(s=>s.Key))
            {
                bool found = false, found2 = false;
                object current = human.GetByTime(v, when, true, ref found);
                object previous = human.GetByTimePrevious(v, when, ref found2);
                if (found)
                {
                    if (current != null && !Object.Equals(current, previous))
                    {
                        if (current is string || current is Relation || current is DateTime)
                        {
                            string Bonus = "";
                            string S = current.ToString();
                            if (current is Relation) S = (current as Relation).ToString(human.Gender);
                            if (S.Length > 50) S = S.Remove(47).Replace("\r", "").Replace("\n", "") + "...";
                            Bonus = "( " + S + " )";
                            if (!String.IsNullOrEmpty(S))
                            {
                                result += "\r\n";
                                if (previous != null && !String.IsNullOrEmpty(previous.ToString())) result += "сменил ";
                                else result += "добавил ";
                                result += Human.Properties[v].ToLower(CultureInfo.CurrentCulture) + Bonus;
                            }
                            else
                            {
                                if (previous != null && !String.IsNullOrEmpty(previous.ToString()))
                                    result += "\r\n удалил " + Human.Properties[v].ToLower();
                            }
                        }
                        else
                            result += "\r\n изменил " + Human.Properties[v];
                    }
                    else
                    {
                        if (current == null && previous != null)
                            result += "\r\n удалил " + Human.Properties[v];
                    }
                }
            }
            if (!String.IsNullOrEmpty(result)) result = human + " изменился:" + result;
            return result;
        }
    }
}
